/*
 * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
 * Distributed under the terms of the MIT License.
 */

#include "setjmp_internal.h"


/* int sigsetjmp(jmp_buf buffer, int saveMask) */
FUNCTION(__sigsetjmp):
FUNCTION(sigsetjmp):
	// Save instruction/stack pointers.
	movq	(%rsp), %rax
	movq	%rax, JMP_REGS_IP(%rdi)
	leaq	8(%rsp), %rax
	movq	%rax, JMP_REGS_SP(%rdi)

	// Save callee-save registers.
	movq	%rbp, JMP_REGS_BP(%rdi)
	movq	%rbx, JMP_REGS_BX(%rdi)
	movq	%r12, JMP_REGS_R12(%rdi)
	movq	%r13, JMP_REGS_R13(%rdi)
	movq	%r14, JMP_REGS_R14(%rdi)
	movq	%r15, JMP_REGS_R15(%rdi)

	// __setjmp_save_sigs handles signal mask and return value.
	jmp		__setjmp_save_sigs@PLT
FUNCTION_END(setjmp)


/* int setjmp(jmp_buf buffer) */
FUNCTION(setjmp):
FUNCTION(_setjmp):
	// Jump to sigsetjmp with a zero saveMask.
	xorl	%esi, %esi
	jmp		sigsetjmp@PLT
FUNCTION_END(setjmp)


#pragma weak _setjmp=setjmp
